// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_THREAD_ID_H_
#define V8_THREAD_ID_H_

#include "src/base/macros.h"

namespace v8 {
namespace internal {

    // Platform-independent, reliable thread identifier.
    class ThreadId {
    public:
        // Creates an invalid ThreadId.
        constexpr ThreadId() noexcept
            : ThreadId(kInvalidId)
        {
        }

        bool operator==(const ThreadId& other) const { return id_ == other.id_; }
        bool operator!=(const ThreadId& other) const { return id_ != other.id_; }

        // Checks whether this ThreadId refers to any thread.
        bool IsValid() const { return id_ != kInvalidId; }

        // Converts ThreadId to an integer representation.
        constexpr int ToInteger() const { return id_; }

        // Returns ThreadId for current thread if it exists or invalid id.
        static ThreadId TryGetCurrent();

        // Returns ThreadId for current thread.
        static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }

        // Returns invalid ThreadId (guaranteed not to be equal to any thread).
        static constexpr ThreadId Invalid() { return ThreadId(kInvalidId); }

        // Converts ThreadId to an integer representation
        // (required for public API: V8::V8::TerminateExecution).
        static constexpr ThreadId FromInteger(int id) { return ThreadId(id); }

    private:
        static constexpr int kInvalidId = -1;

        explicit constexpr ThreadId(int id) noexcept
            : id_(id)
        {
        }

        V8_EXPORT_PRIVATE static int GetCurrentThreadId();

        int id_;
    };

} // namespace internal
} // namespace v8

#endif // V8_THREAD_ID_H_
